home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Precision Software Appli…tions Silver Collection 1
/
Precision Software Applications Silver Collection Volume One (PSM) (1993).iso
/
tutor
/
cptutt22.arj
/
CHAP01.TXT
next >
Wrap
Text File
|
1992-01-20
|
23KB
|
531 lines
Chapter 1
SIMPLE THINGS
As we begin the study of C++ and object oriented programming, a few
comments are in order to help you get started. Since the field of
object oriented programming is probably new to you, you will find
that there is a significant amount of new terminology for you to
grasp. This is true of any new endeavor and you should be warned
not to be intimidated by all of the new concepts. We will add a
few new topics in each chapter and you will slowly grasp the entire
language.
Chapters one through four of this tutorial will concentrate on the
non object oriented programming additions to C++. We will not
begin the discussion of any object oriented programming techniques
until chapter five.
EVEN COMMENTS ARE IMPROVED IN C++
_________________________________________________________________
Examine the file named CONCOM.CPP for an example ==============
of several new things in C++. We will take the CONCOM.CPP
new constructs one at a time beginning with the ==============
comments.
A comment begins with the double slash "//", starts anywhere on a
line, and runs to the end of that line where it is automatically
terminated. The old method of comment definition used with ANSI-
C can also be used with C++ as illustrated in lines 11 through 14,
among other places in this program. The new method is the
preferred method of comment definition because it is impossible to
inadvertently comment out several lines of code. This can be done
by forgetting to include the end of comment notation when using the
older C method of comment notation. Good programming practice
would be to use the new method for all comments and reserve the old
method for use in commenting out a section of code during debugging
since the two methods can be nested.
It would be well to caution you at this point however, that you
should not use comments when the same sense of program definition
can be obtained by using meaningful names for variables, constants,
and functions. The careful selection of variable and function
names can make nearly any code self documenting and you should
strive to achieve this in your code.
Page 1-1
Chapter 1 - Simple Things
THE KEYWORDS const AND volatile
_________________________________________________________________
There are two new keywords used in lines 9 through 11 which were
not part of the original K&R definition of C, but are part of the
ANSI-C standard. The keyword const is used to define a constant.
In line 9 the constant is of type int, it is named START, and is
initialized to the value 3. The compiler will not allow you to
accidentally or purposefully change the value of START because it
has been declared a constant. If you had another variable named
STARTS, the system would not allow you to slightly misspell STARTS
as START and accidentally change it. The compiler would give you
an error message so you could fix the error. Since it is not
permissible to change the value of a constant, it is imperative
that you initialize it when it is declared so it will have a useful
value. The compiler does not require you to initialize it however,
and will not issue an error message if you do not.
You will note that the keyword const is also used in the function
header in line 21 to indicate that the formal parameter named
data_value is a constant throughout the function. Any attempt to
assign a new value to this variable will result in a compile error.
This is a small thing you can add to your programs to improve the
compilers ability to detect errors for you.
The keyword volatile is also part of the ANSI-C standard but was
not included in the original K&R definition of C. Even though the
value of a volatile variable can be changed by you, the programmer,
there may be another mechanism by which the value could be changed,
such as by an interrupt timer causing the value to be incremented.
The compiler needs to know that this value may be changed by some
external force when it optimizes the code. A study of code
optimization methods is very interesting, but beyond the scope of
this tutorial. Note that a constant can also be volatile, which
means that you cannot change it, but the system can through some
hardware function.
Ignore the output statement given in line 23 for a few minutes.
We will study it in some detail later in this chapter. If you are
experienced in K&R style programming, you may find line 5 and 21
a little strange. This illustrates prototyping and the modern
method of function definition as defined by the ANSI-C standard.
We will discuss this in great detail in chapter 4 of this tutorial.
Prototyping is optional in C but absolutely required in C++. For
that reason, chapter 4 of this tutorial is devoted entirely to
prototyping.
It would be advantageous for you to compile and execute this
program with your C++ compiler to see if you get the same result
as given in the comments at the end of the listing. One of the
primary purposes of compiling it is to prove that your compiler is
loaded and executing properly.
Page 1-2
Chapter 1 - Simple Things
THE SCOPE OPERATOR
_________________________________________________________________
The example program named SCOPEOP.CPP ===============
illustrates another construct that is new to SCOPEOP.CPP
C++. There is no corresponding construct in ===============
either K&R or ANSI-C. This allows access to the
global variable named index even though there is
a local variable of the same name within the main function. The
use of the double colon in front of the variable name, in lines 11,
13, and 16, instructs the system that we are interested in using
the global variable named index, defined in line 4, rather than the
local variable defined in line 8.
The use of this technique allows access to the global variable for
any use. It could be used in calculations, as a function
parameter, or for any other purpose. It is not really good
programming practice to abuse this construct, because it could make
the code difficult to read. It would be best to use a different
variable name instead of reusing this name, but the construct is
available to you if you find that you need it sometime.
The scope operator allows access to global variables even though
hidden by a local variable. Be sure to compile and execute this
program before proceeding on to the next example program where we
will discuss the cout operator in lines 10, 11, 15, and 16.
THE iostream LIBRARY
_________________________________________________________________
Examine the example program named MESSAGE.CPP ===============
for our first hint of object oriented MESSAGE.CPP
programming, even though it is a very simple ===============
one. In this program, we define a few variables
and assign values to them for use in the output
statements illustrated in lines 17 through 20, and in lines 23
through 26. The new operator cout is the output function to the
standard device, the monitor, but works a little differently from
our old familiar printf() function, because we do not have to tell
the system what type we are outputting.
C++, like the C language itself, has no input or output operations
as part of the language itself, but defines the stream library to
add input and output functions in a very elegant manner.
The operator <<, sometimes called the "put to" operator but more
properly called the insertion operator, tells the system to output
the variable or constant following it, but lets the system decide
how to output the data. In line 17, we first tell the system to
output the string, which it does by copying characters to the
monitor, then we tell it to output the value of index. Notice
however, that we fail to tell it what the type is or how to output
the value. Since we don't tell the system what the type is, it is
Page 1-3
Chapter 1 - Simple Things
up to the system to determine what the type is and to output the
value accordingly. After the system finds the correct type, we
also leave it up to the system to use the built in default as to
how many characters should be used for this output. In this case,
we find that the system uses exactly as many as needed to output
the data, with no leading or trailing blanks, which is fine for
this output. Finally, the newline character is output, and the
line of code is terminated with a semicolon.
When we called the cout output function in line 17, we actually
called two different functions because we used it to output a
string and a variable of type int. This is the first hint at
object oriented programming because we simply broadcast a message
to the system to print out a value, and let the system find an
appropriate function to do so. We are not required to tell the
system exactly how to output the data, we only tell it to output
it. This is a very weak example of object oriented programming,
and we will get into it in much more depth later.
In line 18, we tell the system to output a different string,
followed by a floating point number, and another string of one
character, the newline character. In this case, we told it to
output a floating point number without telling it that it was a
floating point number, once again letting the system choose the
appropriate output means based on its type. We did lose a bit of
control in the transaction, however, because we had no control over
how many significant digits to print before or after the decimal
point. We chose to let the system decide how to format the output
data.
The variable named letter is of type char, and is assigned the
value of the uppercase X in line 14, then printed as a letter in
line 19.
Because C++ has several other operators and functions available
with streams, you have complete flexibility in the use of the
stream output functions. You should refer to your compiler
documentation for details of other available formatting commands.
The cout and the printf() statements can be mixed in any way you
desire. Both statements result in output to the monitor.
MORE ABOUT THE stream LIBRARY
_________________________________________________________________
The stream library was defined for use with C++ in order to add to
the execution efficiency of the language. The printf() function
was developed early in the life of the C language and is meant to
be all things to all programmers. As a result, it became a huge
function with lots of extra baggage that is only used by a few
programmers. By defining the small special purpose stream library,
the designer of C++ allows the programmer to use somewhat limited
formatting capabilities, which are still adequate for most
programming jobs. If more elaborate formatting capabilities are
Page 1-4
Chapter 1 - Simple Things
required, the complete printf() library is available within any C++
program, and the two types of outputs can be freely mixed.
Lines 23 through 26 illustrate some of the additional features of
the stream library which can be used to output data in a very
flexible yet controlled format. The value of index is printed out
in decimal, octal, and hexadecimal format in lines 23 through 25.
When one of the special stream operators, dec, oct, or hex, is
output, all successive output will be in that number base. Looking
ahead to line 32, we find the value of index printed in hex format
due to the selection of the hexadecimal base in line 25. If none
of these special stream operators are output, the system defaults
to decimal format.
THE cin OPERATOR
_________________________________________________________________
In addition to the cout operator, there is a cin operator which is
used to read data from the standard input device, usually the
keyboard. The cin operator uses the >> operator, usually called
the "get from" operator but properly called the extraction
operator. It has most of the flexibility of the cout operator.
A brief example of the use of the cin operator is given in lines
28 through 30. The special stream operators, dec, oct, and hex,
also select the number base for the cin stream separately from the
cout stream. If none is specified, the input stream also defaults
to decimal.
In addition to the cout operator and the cin operator there is one
more standard operator, the cerr, which is used to output to the
error handling device. This device cannot be redirected to a file
like the output to the cout can be. The three operators, cout,
cin, and cerr, correspond to the stdout, the stdin, and the stderr
stream pointers of the programming language C. Their use will be
illustrated throughout the remainder of this tutorial.
The stream library also has file I/O capability which will be
briefly illustrated in the next example program.
Be sure to compile and execute this program before going on to the
next one. Remember that the system will ask you to enter an
integer value which will be echoed back to the monitor, but changed
to the hexadecimal base.
FILE STREAM OPERATIONS
_________________________________________________________________
Examine the example program named FSTREAM.CPP ===============
for examples of the use of streams with files. FSTREAM.CPP
===============
In this program a file is opened for reading,
another for writing, and a third stream is
Page 1-5
Chapter 1 - Simple Things
opened to the printer to illustrate the semantics of stream
operations on a file. The only difference between the streams in
the last program and the streams in this program is the fact that
in the last program, the streams were already opened for us by the
system. You will note that the stream named printer is used in the
same way we used the cout operator in the last program. Finally,
because we wish to exercise good programming practice, we close
all of the files we have opened prior to ending the program.
The standard file I/O library is available with ANSI-C and is as
easy to use as the stream library and very portable. For more
information on the stream file I/O library, see Bjarne Stroustrup's
book which is listed in the introduction to this tutorial, or refer
to your compiler documentation.
Be sure to compile and execute this program. When you execute it,
it will request a file to be copied. You can enter the name of any
ASCII file that resides in the current directory.
VARIABLE DEFINITIONS
_________________________________________________________________
Examine the file named VARDEF.CPP for a few more ==============
additions to the C++ language which aid in VARDEF.CPP
writing a clear and easy to understand program. ==============
In C++, as in ANSI-C, global and static
variables are automatically initialized to zero
when they are declared. The variables named index in line 4, and
goofy in line 26 are therefore automatically initialized to zero.
Of course, you can still initialize either to some other value if
you so desire. Global variables are sometimes called external
since they are external to any functions.
Automatic variables, those declared inside of any function, are not
automatically initialized but will contain the value that happens
to be in the location where they are defined, which must be
considered a garbage value. The variable named stuff in line 8,
therefore does not contain a valid value, but some garbage value
which should not be used for any meaningful purpose. In line 11,
it is assigned a value based on the initialized value of index and
it is then displayed on the monitor for your examination.
THE REFERENCE VARIABLE
_________________________________________________________________
Notice the ampersand in line 9. This defines another_stuff as a
reference variable which is a new addition to C++. The reference
variable should not be used very often, if at all, in this context.
In order to be complete however, we will discuss its operation.
The reference variable is not quite the same as any other variable
because it operates like a self dereferencing pointer. Following
its initialization, the reference variable becomes a synonym for
Page 1-6
Chapter 1 - Simple Things
the variable stuff, and changing the value of stuff will change the
value of another_stuff because they are both actually referring to
the same variable. The synonym can be used to access the value of
the variable for any legal purpose in the language. It should be
pointed out that a reference variable must be initialized to
reference some other variable when it is declared or the compiler
will respond with an error. Following initialization, the
reference variable cannot be changed to refer to a different
variable.
The use of the reference variable in this way can lead to very
confusing code, but it has another use where it can make the code
very clear and easy to understand. We will study this use in
chapter 4 of this tutorial.
DEFINITIONS ARE EXECUTABLE STATEMENTS
_________________________________________________________________
Coming from your background of C, you will find the statement in
line 16 very strange, but this is legal in C++. Anyplace it is
legal to put an executable statement, it is also legal to declare
a new variable because a data declaration is defined as an
executable statement in C++. In this case, we define the new
variable named more_stuff and initialize it to the value of 13.
It has a scope from the point where it was defined to the end of
the block in which it is defined, so it is valid throughout the
remainder of the main program. The variable named goofy is
declared even later in line 26.
It is very significant that the variable is declared near its point
of usage. This makes it easier to see just what the variable is
used for, since it has a much more restricted scope of validity.
When you are debugging a program, it is convenient if the variable
declaration is located in close proximity to where you are
debugging the code.
WHAT ABOUT definition AND declaration?
_________________________________________________________________
The words definition and declaration refer to two different things
in C++, and in ANSI-C also for that matter. They really are
different and have different meanings, so we should spend a little
time defining exactly what the words mean in C++. A declaration
provides information to the compiler about the characteristics of
something such as a type or a function but it doesn't actually
define any code to be used in the executable program, and you are
permitted to make as many declarations of the same entity as you
desire. A definition, on the other hand, actually defines
something that will exist in the executable program, either some
useful variables, or some executable code, and you are required to
Page 1-7
Chapter 1 - Simple Things
have one and only one definition of each entity in the program.
In short, a declaration introduces a name into the program and a
definition introduces some code.
If we declare a struct, we are only declaring a pattern to tell the
compiler how to store data later when we define one or more
variables of that type. But when we define some variables of that
type, we are actually declaring their names for use by the
compiler, and defining a storage location to store the values of
the variables. Therefore, when we define a variable, we are
actually declaring it and defining it at the same time.
We will refer to these definitions many times throughout the course
of this tutorial so if this is not clear now, it will clear up
later.
A BETTER for LOOP
_________________________________________________________________
Take careful notice of the for loop defined in line 20. This loop
is a little clearer than the for loop that is available in ANSI-
C, because the loop index is defined in the for loop itself. The
scope of this loop index is from its declaration to the end of the
enclosing block. In this case its scope extends to line 29 since
the closing brace in line 29 corresponds to the most recent opening
brace prior to the declaration of the variable. Since the variable
is still available, it can be used for another loop index or for
any other purpose which an integer type variable can legally be
used for. The variable named count2 is declared and initialized
during each pass through the loop because it is declared within the
block controlled by the for loop. Its scope is only the extent of
the loop so that it is automatically deallocated each time the loop
is completed. It is therefore declared, initialized, used and
deallocated five times, once for each pass through the loop.
You will notice that the variable count2 is assigned a numerical
value in line 22 but when it is printed out, a character value is
actually output. This is because C++ (version 2.0 and later) is
careful to use the correct type.
Finally, as mentioned earlier, the static variable named goofy is
declared and automatically initialized to zero in line 26. Its
scope is from the point of its declaration to the end of the block
in which it is declared, line 29.
Be sure to compile and execute this program.
OPERATOR PRECEDENCE
_________________________________________________________________
Operator precedence is identical to that defined for ANSI-C so no
attempt will be made here to define it. There is a small
Page 1-8
Chapter 1 - Simple Things
difference when some operators are overloaded which we will learn
to do later in this tutorial. Some of the operators act slightly
different when overloaded than the way they operate with elements
of the predefined language.
Do not worry about the previous paragraph, it will make sense later
in this tutorial after we have studied a few more topics.
PROGRAMMING EXERCISES
_________________________________________________________________
1. Write a program that displays your name and date of birth on
the monitor three times using the cout function. Define any
variables you use as near as possible to their point of usage.
2. Write a program with a few const values and volatile variables
and attempt to change the value of the constants to see what
kind of error message your compiler will give you.
3. Write a program that uses streams to interactively read in
your birthday with three different cin statements. Print your
birthday in octal, decimal, and hexadecimal notation just for
the practice.
Page 1-9